View Javadoc
1 /* ==================================================================== 2 * The Apache Software License, Version 1.1 3 * 4 * Copyright (c) 2000 The Apache Software Foundation. All rights 5 * reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * 19 * 3. The end-user documentation included with the redistribution, 20 * if any, must include the following acknowledgment: 21 * "This product includes software developed by the 22 * Apache Software Foundation (http://www.apache.org/)." 23 * Alternately, this acknowledgment may appear in the software itself, 24 * if and wherever such third-party acknowledgments normally appear. 25 * 26 * 4. The names "Apache" and "Apache Software Foundation" must 27 * not be used to endorse or promote products derived from this 28 * software without prior written permission. For written 29 * permission, please contact apache@apache.org. 30 * 31 * 5. Products derived from this software may not be called "Apache", 32 * nor may "Apache" appear in their name, without prior written 33 * permission of the Apache Software Foundation. 34 * 35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 46 * SUCH DAMAGE. 47 * ==================================================================== 48 * 49 * This software consists of voluntary contributions made by many 50 * individuals on behalf of the Apache Software Foundation. For more 51 * information on the Apache Software Foundation, please see 52 * <http://www.apache.org/>;. 53 * 54 * Portions of this software are based upon public domain software 55 * originally written at the National Center for Supercomputing Applications, 56 * University of Illinois, Urbana-Champaign. 57 */ 58 59 package net.sourceforge.jane.lang.jjtree; 60 61 import net.sourceforge.jane.Jane; 62 import net.sourceforge.jane.JaneException; 63 import net.sourceforge.jane.lang.ClassInfo; 64 import net.sourceforge.jane.lang.LazyClassInfo; 65 import net.sourceforge.jane.jjtree.JavaImportDeclaration; 66 import net.sourceforge.jane.jjtree.ChildNodeEnumeration; 67 68 import org.apache.commons.logging.Log; 69 import org.apache.commons.logging.LogFactory; 70 71 /*** 72 * A {@link LazyClassInfo} implementation that lazily loads a {@link ClassInfo} 73 * from jjTree information. 74 */ 75 public class JJTreeLazyClassInfo extends LazyClassInfo 76 { 77 78 private Log log = LogFactory.getLog(JJTreeLazyClassInfo.class); 79 80 private String className; 81 private</b> String packageName; 82 private ChildNodeEnumeration imports; 83 84 /*** 85 * Create a new <code>JJTreeLazyClassInfo</code>. 86 */ 87 public JJTreeLazyClassInfo(Jane aJane, 88 String aPackageName, 89 String aClassName, 90 ChildNodeEnumeration theImports) 91 { 92 super(aJane); 93 packageName = aPackageName; 94 className = aClassName; 95 imports = theImports; 96 } 97 98 /*** 99 * Load the delegate. 100 */ 101 protected ClassInfo loadDelegate() 102 { 103 ClassInfo found = null; 104 105 found = findClassAsFullyQualified(); 106 107 if (found != null) 108 return found; 109 110 found = findClassUsingExplicitImport(); 111 112 if (found != null) 113 return found; 114 115 found = findClassUsingImplicitImport(); 116 117 if (found != null) 118 return found; 119 120 found = findClassInPackage("java.lang"); 121 122 if (found != null) 123 return found; 124 125 found = findClassInPackage(packageName); 126 127 if (found != null) 128 return found; 129 130 // TODO: Figure out how to find inner classes. 131 // TODO: Figure out what to return instead of null. 132 return null; 133 } 134 135 /*** 136 * Attempt to find the specified class as fully-qualified. 137 */ 138 private ClassInfo findClassAsFullyQualified() 139 { 140 try { 141 if (log.isTraceEnabled()) 142 log.trace("Search for class as fully-qualified: " + className); 143 return jane.findClass(className); 144 } catch (JaneException e) { 145 log.error("Error finding class: " + className, e); 146 } 147 return null; 148 } 149 150 /*** 151 * Attempt to find the specified class from an explicit import. 152 */ 153 private ClassInfo findClassUsingExplicitImport() 154 { 155 ClassInfo clazz = null; 156 while (imports.hasMoreNodes()) { 157 JavaImportDeclaration node = (JavaImportDeclaration) imports.nextNode(); 158 if (node.isExplicit()) { 159 String value = node.getValue(); 160 if (value.endsWith("." + className)) { 161 if (log.isTraceEnabled()) 162 log.trace("Search for class using explicit import: " + value); 163 try { 164 clazz = jane.findClass(value); 165 } catch (JaneException e) { 166 log.error("Error resolving: " + value, e); 167 } 168 } 169 } 170 } 171 imports.reset(); 172 return clazz; 173 } 174 175 /*** 176 * Attempt to find the specified class from an implicit import. 177 */ 178 private ClassInfo findClassUsingImplicitImport() 179 { 180 ClassInfo clazz = null; 181 while (imports.hasMoreNodes() && clazz == null) { 182 JavaImportDeclaration node = (JavaImportDeclaration) imports.nextNode(); 183 if (!node.isExplicit()) { 184 String value = node.getValue(); 185 clazz = findClassInPackage(value); 186 } 187 } 188 imports.reset(); 189 return clazz; 190 } 191 192 /*** 193 * Attempt to find the given class in the given package. 194 */ 195 private ClassInfo findClassInPackage(String pkg) 196 { 197 if (log.isTraceEnabled()) 198 log.trace("Search for class in package: " + pkg); 199 try { 200 return jane.findClass(pkg + "." + className); 201 } catch (JaneException e) { 202 log.error("Error resolving: name=" + className + " pkg=" + pkg, e); 203 } 204 return null; 205 } 206 207 } 208

This page was automatically generated by Maven